home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / 80X86 / WDOSX092.ZIP / WDOSX.TXT < prev    next >
Encoding:
Text File  |  1996-10-18  |  20.3 KB  |  641 lines

  1.  
  2. -------------------------------------------------------------------------------
  3.                                 WDOSX V.0.92
  4. -------------------------------------------------------------------------------
  5.  
  6. Hi everybody out there!
  7.  
  8. Even if I would like writing docs, it would not look any better since it
  9. isn't one of my strenghts anyway.
  10.  
  11. OTOH: If I didn't write at least a few lines, nobody would know what to do
  12. with this stuff, right?
  13.  
  14. So here we go, but don't expect too much :)
  15.  
  16. 0. INTRODUCTION
  17.  
  18. This is not my first DOS- extender, but it's the first one I release to the
  19. public. You may ask yourself: Hmm... yet another DOS- extender, aren't there
  20. already >1.000.000 out there?
  21. First of all: I do not encourage anyone to use exactly _this_ one, but for
  22. me it is a fun project and now it came to a point where it could be useful
  23. for someone else. Then again, it may be a waste. Who really cares? 
  24. The intention was to write a DOS- extender that is pretty small sized and handy
  25. to use, so we can do all our quick hacks in 32bit too.
  26.  
  27. This is the second release. V.0.90 has been nuked by myself, though it
  28. wasn't all that bad.
  29.  
  30. IF YOU ARE NEW TO 32 BIT ASM PROGRAMMING:
  31.  
  32.    There are other DOS extender packages out, some of them also for free,
  33.    all of them w/ or w/o some features you'd like to have.
  34.  
  35.    Before starting you should check out at least the free ones to find
  36.    the one that fits best.
  37.  
  38.    BTW: Note that I haven't any $$$ losses if you decide to not use WDOSX!
  39.  
  40.    A must_have_seen_before is TRAN's PMODE. This is some sort of a classic,
  41.    so most people know it and you will get a lot of help on usenet if you
  42.    encounter problems.
  43.  
  44.    You should also consider the fact that this DOC is not an introduction into
  45.    DPMI and/or 32 bit programming, so you'll be unable to use WDOSX without
  46.    some basic knowledge on the subject.
  47.  
  48.  
  49. IF YOU ARE NOT SO NEW TO 32 BIT ASM PROGRAMMING:
  50.  
  51.    C'mon, give it a try!
  52.  
  53. WHOAMI (the author):
  54.  
  55. Michael Tippach
  56. Stockartstrasse 27
  57. 04277 Leipzig, Germany
  58. Phone/Fax: 49 341 3028848
  59.                  
  60. email    : tippachm@dialin.deh.de               (preferred)
  61.            tippach@metronet.de                  (very buggy provider)
  62.            heiko.friedel@phil.tu-chemnitz.de    (if above don't work)
  63.  
  64.  
  65. WHATISTHISSTUFFABOUT:
  66.  
  67. WDOSX is just another DOS- extender for 32 bit ASM programming. It supports
  68. DPMI/VCPI/XMS/RAW memory allocation, hardware interrupt autopassup and other
  69. nice features.
  70.  
  71. WDOSX can easyly be incorporated into the final .EXE - file, increasing its
  72. size by somewhat around 8k.
  73.  
  74. The archive should contain the following files:
  75.  
  76. WDOSX.TXT    -  THIS FILE
  77. WHATSNEW.TXT -  MAINLY A PRESENTATION OF MY VERY OWN STUPIDITY (BUGFIXES)
  78. WDOSX.DX     -  THE DOS-EXTENDER STUB (RENAMED EXECUTABLE)
  79. EXAMPLE.ASM  -  ASM EXAMPLE, DOES SOMETHING BUT DON'T TAKE IT TOO SERIOUS!
  80. MAKEEXAM.BAT -  MAKE EXAMPLE (TASM + TLINK REQ'D)
  81. MOUSE.ASM    -  SAMPLE CODE FOR MOUSE EVENT HANDLER
  82. HEADER.ASM   -  SAMPLE STARTUP CODE FOR MIXING C AND ASM (BC4)
  83. HELLO.C      -  AS THE FILENAME IS TELLING YOU
  84. C.BAT        -  GET HELLO.C RUNNING WITH WDOSX
  85. FILE_ID.DIZ  -  GUESS WHAT!
  86.  
  87. Even though there've been a lot of bugfixes since version 0.90 this one
  88. is far from beeing perfect!
  89.  
  90. 1. LEGAL STUFF
  91.  
  92. I hate^2 this one but would YOU love it to get sued for giving something
  93. to others for FREE? (OTOH: there's kinda strange fascination going out from
  94. legal stuff like that, isn't it?)
  95.  
  96. DISCLAIMER:
  97.  
  98. THIS SOFTWARE IS PROVIDED "AS IS". I, THE AUTOR, SHALL NOT BE LIABLE FOR ANY
  99. KIND OF LOSS OR DAMAGE ARISING OUT OF THE USE, ABUSE OR THE INABILITY TO USE
  100. THIS SOFTWRAE.
  101.  
  102. ABSOLUTE NO WARRANTY / LIABILITY:
  103.  
  104.    THIS SOFTWARE COMES WITHOUT ANY KIND OF WARRANTY, EITHER EXPRESSED OR 
  105.    IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTY OF 
  106.    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  107.  
  108.    IN NO EVENT SHALL I, THE AUTOR, BE LIABLE FOR ANY KIND OF DAMAGE ARISING
  109.    OUT OF THE USE, ABUSE OR INABILITY TO USE THE SOFTWARE.
  110.  
  111.    IF YOU DON'T AGREE WITH THIS TERMS OR IF YOUR JURISTDICTION DOES NOT ALLOW
  112.    THE EXCLUSION OF WARRANTY AND LIABILITY AS STATED ABOVE :( YOU SHALL NOT
  113.    USE THIS SOFWARE!
  114.    (Should I add: "RETURN THE PACKAGE TO YOUR DEALER FOR A FULL REFUND"?)
  115.  
  116.  
  117. This software is freeware. Non- exclusive permission to use this software in
  118. its unmodified form for the purpose of building protected mode applications
  119. hereby granted.
  120.  
  121. You may freely distribute this software, but you must keep all files, including
  122. this documentation, together and unaltered.
  123.  
  124. You may further sell applications build using WDOSX as a DOS extender stub, but
  125. you are not allowed to sell this software as a stand alone product or as part
  126. of a software compilation, except for an usual fee covering the distribution
  127. itself.
  128.  
  129. THIS SOFTWARE IS COPYRIGHT (C)1996, MICHAEL TIPPACH, ALL RIGHTS NOT EXPLICITELY
  130. GRANTED IN THIS DOCUMENT RESERVED!
  131.  
  132. ENGLISH: IF YOU MAKE ME WISH I NEVER HAD RELEASED IT, YOU SHOULD ROT IN HELL!
  133.  
  134. BTW:
  135.             ________
  136.      CLICK |__HERE__| TO DOWNLOAD THE SOURCECODE NOW!
  137.  
  138.      There's no reason why I shouldn't release the sourcecode, but, if you
  139.      read this DOC you probably imagine how messy the source may look like :)
  140.      Another reason: I wanted to keep the package size as small as possible,
  141.      -> actually not _everyone_ is _really_ interested in that mess and some
  142.      people with slow and/or unreliable connections will thank me for the idea.
  143.      If you're _born ready_ to read my sources, hmm...  mail me.
  144.  
  145.      But note: I'll never ever comment every line you didn't understand
  146.      (maybe I _will_ do though, but pleeaaase, don't check that out!)
  147.  
  148.      And YES: just another reason is that I want feedback!
  149.  
  150.      Anyway: I do not want people to distribute modified versions of the source
  151.      code. If you think you're better in writing DOS extenders than me, hmm...
  152.      write your own from scratch! If you have suggestions how to make it a
  153.      better piece of code, send me a mail and you're welcome to join the party.
  154.            
  155.  
  156. 2.   THE FUN STUFF
  157. 2.1. HOWTO BUILD YOUR 32 BIT PM- APPLICATION?
  158.  
  159.      COPY /B WDOSX.DX + 32_BIT_EXE.EXE FINAL_EXE.EXE
  160.  
  161. That's it! WDOSX.DX is basically a stub that will load your 32 bit program
  162. into extended memory and execute it there.
  163.  
  164. Ahemm... example given:
  165.  
  166. ----- test.asm -----------------------
  167. .386
  168. myseg        segment use32
  169. assume cs:myseg,ds:myseg
  170.  
  171. bla bla bla bla
  172.  
  173. start:
  174.  
  175. init bla bla
  176.  
  177. further bla bla bla, using huge amount of memory
  178.  
  179. outtahere:
  180.                 mov     ax,4c00h
  181.                 int     21h
  182.  
  183. myseg           ends
  184. end             start
  185. --------------------------------------
  186.  
  187. This one (of course not _this_ one) can be compiled:
  188.  
  189. TASM TEST.ASM
  190. TLINK /3 TEST
  191.  
  192. Now we have a TEST.EXE file that will crash the machine if we try to run it.
  193. So we say:
  194.  
  195. COPY /B WDOSX.DX+TEST.EXE MYDEMO.EXE
  196.  
  197. MYDEMO.EXE should run then. Isn't it easy?
  198.  
  199.  
  200. 2.2. HOWTO CODE THE 32 BIT STUFF
  201.  
  202. Do it as you usually would do it. If your code runs with this DOS extender,
  203. I see no reason why it should not run with _every_ generic DPMI 0.9 compliant
  204. DOS- extender (except some minor modifications, not worth considering).
  205. WDOSX checks for a DPMI host and, if it found one,almost all of the WDOSX stuff
  206. is bypassed, else WDOSX emulates the DPMI- host (hmm... a subset of DPMI 0.9,
  207. as of today, see below).
  208.  
  209. Some restrictions:
  210.  
  211. 1. the initial EIP must be less then 64k
  212. 2. the flatmode overlay size is limited to 1Mb
  213.    (this does not prohibit the use of another overlay behind)
  214. 3. Fixups are EVIL! WDOSX does not process fixups in your flatmode overlay.
  215.    Hey, we're in 32 bit protected mode here, so why say stupid things like:
  216.  
  217.           mov ax,@data
  218.           mov ds,ax
  219.    ??????????????????????????
  220.    Don't hardcode selectors, store them in variables instead and everything
  221.    will be fine!
  222.  
  223. Note that restrictions 1+2 are results of the overlay technique I use.
  224. TLINK will crash (yeah, really!) if you try to push the limits 1+2.
  225.  
  226.  
  227. Entry conditions on start:
  228.  
  229. cs:                     guess what!
  230. ds,ss:                  alias(cs)
  231. es:                     selector(PSP)
  232. esp:                    size of flatmode ovelay + 1k = initial segment size
  233.                         dword aligned
  234. anything else:          garbage
  235. virtual interrupts:    disabled
  236.  
  237.  
  238. Not supported so far:
  239.  
  240. - GET/SET EXCEPTION HANDLER:
  241.  
  242.              This is because I didn't need that.
  243.  
  244.              WDOSX, if running without DPMI, will report most exceptions by
  245.              throwing out registers and stuff and terminate the program then
  246.              (as we all know and enjoy :)
  247.  
  248.              As usual, exceptions occuring in real- or V86- mode are not
  249.              reported.
  250.  
  251.              Since the build-in exception handler is called via an interrupt
  252.              gate, the stack has to be intact for proper exception handling.          
  253.              (C'mon, this is a DOS- extender, not an operating system!)
  254.  
  255.              This works as well that I tended to insert a "mov cs:[0],al"
  256.              as some sort of a breakpoint in my app code for debugging.
  257.              You don't use debugging techniques like that, do you?
  258.  
  259. - RAW MODE SWITCH, SAVE/RESTORE STATE AND STUFF
  260.  
  261.              Hate to say that again, but: I didn't need that as of today.
  262.              There are, of course, raw mode switch procedures in the kernel
  263.              and it wouldn't be a big deal to write the interface for them...
  264.              Hmm... maybe next release.
  265.  
  266.  
  267. - ALLOCATE SPECIFIC LDT DESCRIPTOR:
  268.  
  269.              Err... hmmm... this one will never get into WDOSX, because while
  270.              running in RAW/XMS/VCPI mode, we do not have a LDT, everything
  271.              is in the GDT, thus the selectors specified for this function to
  272.              be free actually aren't.
  273.  
  274.              Who cares?
  275.  
  276.  
  277. -------------------------------------------------------------------------------
  278. DPMI- 0.9- functions supported so far...
  279. -------------------------------------------------------------------------------
  280.  
  281. LDT- MANAGEMENT:
  282.  
  283. 0000    ALLOC LDT DESCRIPTORS
  284. 0001    FREE LDT DESKRIPTORS
  285. 0002    SEGMENT -> SELECTOR
  286. 0003    GET SELECTOR INCRMENT
  287. 0006    GET SEGMENT BASE
  288. 0007    SET SEGMENT BASE
  289. 0008    SET SEGMENT LIMIT
  290. 0009    SET ACCESS RIGHTS
  291. 000A    CREATE ALIAS
  292. 000B    GET DESCRIPTOR
  293. 000C    SET DESCRIPTOR
  294.  
  295. DOS- MEM:
  296.  
  297. 0100    ALLOC DOS- MEM
  298. 0101    FREE DOS- MEM
  299. 0102    MODIFY DOS- MEM
  300.  
  301. INTERRUPTS:
  302.  
  303. 0200    GET REALMODE INTERRUPT VECTOR
  304. 0201    SET REALMODE INTERRUPT VECTOR
  305. 0204    GET PM INTERRUPT VECTOR
  306. 0205    SET PM INTERRUPT VECTOR
  307.  
  308. TRANSLATION SERVICES:
  309.  
  310. 0300    SIMULATE REAL MODE INTERRUPT
  311. 0301    CALL REALMODE PROCEDURE (RETF)
  312. 0302    CALL REALMODE PROCEDURE (IRET)
  313. 0303    ALLOCATE REALMODE CALLBACK
  314. 0304    FREE REALMODE CALLBACK
  315.  
  316. VERSION:
  317.  
  318. 0400    GET DPMI VERSION
  319.  
  320. MEMORY MANAGEMENT:
  321.  
  322. 0500    GET FREE MEM
  323. 0501    ALLOC MEM
  324. 0502    FREE MEM
  325. 0503    RESIZE MEM
  326.  
  327. VIRTUAL MEMORY MANAGEMENT:
  328.  
  329. 0600    LOCK LINEAR REGION
  330. 0601    UNLOCK LINEAR REGION
  331. 0602    UNLOCK REALMODE REGION
  332. 0603    RELOCK REALMODE REGION
  333. 0604    GET PHYSICAL PAGE SIZE
  334.  
  335. DEMAND PAGING:
  336.  
  337. 0702    MARK PAGE PAGEABLE
  338. 0703    DISCARD PAGE
  339.  
  340. PHYSICAL MEMORY:
  341.  
  342. 0800    MAP PHYSICAL REGION
  343.  
  344. VIRTUAL ITERRUPTS:
  345.  
  346. 0900    GET AND DISABLE VI STATE
  347. 0901    GET AND ENABLE VI STATE
  348. 0902    GET STATE
  349.  
  350. -------------------------------------------------------------------------------
  351. Flatmode support API            
  352. -------------------------------------------------------------------------------
  353.  
  354. To make things _really_ easy to code, I started to implement some sort of
  355. an API. All functions are called via INT 21H and (except 21/FFFFH) are
  356. the 32 bit representation of their respective DOS pendants.
  357. This is not very complete, but it will be extended as soon as I need some other
  358. DOS- functions frequently OR you send me mail that I should incorporate a
  359. specific function ASAP, cause you desperatly neeeed it.
  360.  
  361. A couple of functions are new in v 0.91 and in v 0.92 I added yet another two.
  362.  
  363. Note that this stuff can also be hand- coded using DPMI functions, but
  364. IMO this is quite a pain to do over and over again.
  365.  
  366. OTOH: Using this API will make it more difficult to port your code to other
  367. DOS- extenders, using DPMI functions usually wont!
  368.  
  369. Supported so far:
  370.  
  371. -------------------------------------------------------------------------------
  372. 21/09 - DOS- write string to console
  373. -------------------------------------------------------------------------------
  374.  
  375. DIFFERENCES WDOSX/DOS:
  376.  
  377. - DOS uses DS:DX, WDOSX uses DS:EDX
  378.  
  379. -------------------------------------------------------------------------------
  380. 21/39 - DOS- MKDIR
  381. -------------------------------------------------------------------------------
  382.  
  383. DIFFERENCES WDOSX/DOS:
  384.  
  385. - DOS uses DS:DX, WDOSX uses DS:EDX
  386.  
  387. -------------------------------------------------------------------------------
  388. 21/3A - DOS- RMDIR
  389. -------------------------------------------------------------------------------
  390.  
  391. DIFFERENCES WDOSX/DOS:
  392.  
  393. - DOS uses DS:DX, WDOSX uses DS:EDX
  394.  
  395. -------------------------------------------------------------------------------
  396. 21/3B - DOS- CHDIR
  397. -------------------------------------------------------------------------------
  398.  
  399. DIFFERENCES WDOSX/DOS:
  400.  
  401. - DOS uses DS:DX, WDOSX uses DS:EDX
  402.  
  403. -------------------------------------------------------------------------------
  404. 21/3C - DOS- create
  405. -------------------------------------------------------------------------------
  406.  
  407. DIFFERENCES WDOSX/DOS:
  408.  
  409. - DOS uses DS:DX, WDOSX uses DS:EDX
  410.  
  411. -------------------------------------------------------------------------------
  412. 21/3D - DOS- open
  413. -------------------------------------------------------------------------------
  414.  
  415. DIFFERENCES WDOSX/DOS:
  416.  
  417. - DOS uses DS:DX, WDOSX uses DS:EDX
  418.  
  419. -------------------------------------------------------------------------------
  420. 21/3F - DOS- read
  421. -------------------------------------------------------------------------------
  422.  
  423. DIFFERENCES WDOSX/DOS:
  424.  
  425. - DOS uses DS:DX, WDOSX uses DS:EDX
  426. - DOS uses CX = bytes to read, WDOSX uses ECX
  427. - DOS returns AX = bytes read, WDOSX returns EAX = bytes read
  428.  
  429. This means: YES! You _can_ read more than 64k at once!
  430.  
  431. -------------------------------------------------------------------------------
  432. 21/40 - DOS- write
  433. -------------------------------------------------------------------------------
  434.  
  435. DIFFERENCES WDOSX/DOS:
  436.  
  437. - DOS uses DS:DX, WDOSX uses DS:EDX
  438. - DOS uses CX = bytes to write, WDOSX uses ECX
  439. - DOS returns AX = bytes written, WDOSX returns EAX = bytes written
  440.  
  441. This means: YES! You _can_ write more than 64k at once!
  442.  
  443. -------------------------------------------------------------------------------
  444. 21/41 - DOS- delete
  445. -------------------------------------------------------------------------------
  446.  
  447. DIFFERENCES WDOSX/DOS:
  448.  
  449. - DOS uses DS:DX, WDOSX uses DS:EDX
  450.  
  451.  
  452. -------------------------------------------------------------------------------
  453. 21/43 - DOS- get/set file attribute
  454. -------------------------------------------------------------------------------
  455.  
  456. DIFFERENCES WDOSX/DOS:
  457.  
  458. - DOS uses DS:DX, WDOSX uses DS:EDX
  459.  
  460. -------------------------------------------------------------------------------
  461. 21/47 - DOS- get current directory
  462. -------------------------------------------------------------------------------
  463.  
  464. DIFFERENCES WDOSX/DOS:
  465.  
  466. - DOS uses DS:SI, WDOSX uses DS:ESI
  467.  
  468. -------------------------------------------------------------------------------
  469. 21/56 - DOS- rename
  470. -------------------------------------------------------------------------------
  471.  
  472. DIFFERENCES WDOSX/DOS:
  473.  
  474. - DOS uses DS:DX, WDOSX uses DS:EDX
  475. - DOS uses ES:DI, WDOSX uses ES:EDI
  476.  
  477. -------------------------------------------------------------------------------
  478. 21/5B - DOS- create new file
  479. -------------------------------------------------------------------------------
  480.  
  481. DIFFERENCES WDOSX/DOS:
  482.  
  483. - DOS uses DS:DX, WDOSX uses DS:EDX
  484.  
  485. ;------------------------------------------------------------------------------
  486.  
  487. EXAMPLE:
  488.  
  489. ;This sample code copies a file 'interrup.lst' (THANKS AGAIN AND AGAIN AND
  490. ;                                                AGAIN AND..., RALF BROWN!!!)
  491. ;into another file 'interrup.2nd', because only _one_ copy of this wonderful
  492. ;DOC is _not_ enough :) ------> This is _my_ way of giving credit, hope you
  493. ;get it right!
  494. ;(Another reason is just that while testing I needed a file that
  495. ; -was huge enough 
  496. ; -fitted into memory
  497. ; -was an ASCII file, so we could easily verify results)
  498. ;
  499. ;As of version 50 this file is somewhat around 4.5 MB
  500.  
  501. .386p
  502. code    segment use32
  503. assume  cs:code,ds:code
  504.  
  505. infile  db 'interrup.lst',0
  506. outfile db 'interrup.2nd',0
  507. errmsg  db 'some sort of error!',0dh,0ah,'$'
  508.  
  509. start:
  510. ;------ enable interrupts ------
  511.  
  512.         mov ax,0901h
  513.         int 31h
  514.  
  515. ;------ alloc memory (see below)
  516.  
  517.         mov ax,-1
  518.         mov edx,500000h   ;5 MB is a good choice :)
  519.         int 21h
  520.         jc some_sort_of_error
  521.         mov esp,edx       ;adjust stackpointer
  522.        
  523. ;------ open input file --------
  524.  
  525.         mov edx,offset infile
  526.         mov ax,3d00h
  527.         int 21h
  528.         jc some_sort_of_error
  529.         mov bx,ax
  530.  
  531. ;------ read input file --------
  532.  
  533.         mov edx,offset filebuffer
  534.         mov ecx,-1    ;read until eof
  535.         mov ah,3fh
  536.         int 21h         ;this could take a while depending on your hardware
  537.         jc some_sort_of_error
  538.         push eax        ;store bytes read, should be filesize
  539.  
  540. ;------ create output file -----
  541.  
  542.         mov edx,offset outfile
  543.         mov ax,3c00h
  544.         sub cx,cx
  545.         int 21h
  546.         jc some_sort_of_error
  547.         mov bx,ax
  548.  
  549. ;------ write output file ------
  550.  
  551.         pop ecx         ;get bytes to write
  552.         mov edx,offset filebuffer
  553.         mov ah,40h
  554.         int 21h         ;could also take a few seconds
  555.         jnc copy_ok
  556.  
  557. ;------ simplex error handler --
  558.  
  559. some_sort_of_error:
  560.         mov edx,offset errmsg
  561.         mov ah,9
  562.         int 21h
  563.         mov ax,4cffh
  564.         int 21h
  565.  
  566. ;------ terminate --------------
  567.  
  568. copy_ok:
  569.         mov ax,4c00h
  570.         int 21h
  571.  
  572. align dword     ;hint: the API will do REP MOVSD whenever possible!
  573.  
  574. filebuffer label near
  575.  
  576. code    ends
  577. end     start
  578.  
  579. Yeah, and that's all. Try to write the same piece of code for 16 bit DOS!
  580.  
  581. -------------------------------------------------------------------------------
  582. INT21H     AX = FFFFH: RESIZE FLAT SEGMENT
  583. -------------------------------------------------------------------------------
  584.  
  585. THIS IS A PROPRIETARY FUNCTION, NOT A DOS- FUNCTION!
  586.  
  587. ON ENTRY: EDX = NEW SIZE
  588. RETURNS : CF CLEAR ON SUCCESS, CF SET: ERROR, NOTHING DONE
  589.  
  590. This one is needed because with INT 31H you cannot resize the segment you're
  591. currently running in. Using this call, you can. But NOTE: This call assumes
  592. to get called from your initial flat segment, don't call from anywhere else!
  593.  
  594. USAGE:
  595.  
  596.  mov ax,0ffffh
  597.  mov edx,400000h           ;new size = 4 MB
  598.  int 21h
  599.  jc what_the_hell_happened ;should only occur if there's not enough memory
  600.  mov esp,edx               ;adjust stack pointer on top of segment
  601.  
  602. _______________________________________________________________________________
  603.  
  604. 3. IF YOU ENCOUNTER PROBLEMS
  605.  
  606. There _are_ bugs in WDOSX (I know,'cause I already caught+fixed a lot of them).
  607.  
  608. Before you report any bugs to me, please try to collect as much information as
  609. possible.
  610.  
  611. Further try to make sure that the strange behaviour _really_ is a result of a
  612. possible bug in WDOSX. (IOW: look at your source code again and again and...)
  613.  
  614. Include the sourcecode that made the bug show up (if you could), or at least,
  615. write a sample piece of code that will reproduce the error.
  616. (from my own experience I know that the latter is a good method to make 99.9%
  617.  sure the source code is clean)
  618.  
  619. Include a short description of the circumstances (hardware, software). If the
  620. bug only shows up in some configurations, also report the configurations
  621. where everything is fine.
  622.  
  623. In short: Give me a chance to fix it!(You're programmers, you know what I mean)
  624.  
  625. Thank you for supporting free software!
  626. _______________________________________________________________________________
  627.  
  628. What comes next? Hmm...how about interface libraries for several C/C++
  629. compilers? Interested?
  630. I already made up an interface for Borland Delphi 2 with this extender.
  631.  
  632.  
  633. That's all folks. Comments and suggestions welcome!
  634.  
  635. HAVE FUN!
  636.  
  637. (Deutsche Dokumentation erhaeltlich, Mehl schicken!)
  638.  
  639. Leipzig, Germany, october '96
  640. Wuschel a.k.a Michael Tippach
  641.